相机服务跨进程设计

chengzhenyu 7 anni fa
parent
commit
b9fbc32686

+ 6 - 3
app/src/main/java/ai/pai/lensman/dslr/CameraService.java

@@ -31,6 +31,9 @@ public class CameraService extends Service {
31 31
     public static final int MSG_CAMERA_CONN_ERROR = 8001;
32 32
     public static final int MSG_CAMERA_NEW_PHOTO_FOUND = 8002;
33 33
 
34
+
35
+    public static final String EXTRA_CMD = "cmd";
36
+    public static final String EXTRA_SESSION_DIR = "session_dir";
34 37
     public static final int CMD_INIT_CAMERA_CONNECTION = 9000;
35 38
     public static final int CMD_EXIT_CAMERA_CONNECTION = 9001;
36 39
     public static final int CMD_START_CAPTURE_PHOTO = 9002;
@@ -51,8 +54,8 @@ public class CameraService extends Service {
51 54
 
52 55
     @Override
53 56
     public int onStartCommand(Intent intent, int flags, int startId) {
54
-        if(intent!=null&&intent.getIntExtra("cmd",0)>0){
55
-            int cmd = intent.getIntExtra("cmd",0);
57
+        if(intent!=null&&intent.getIntExtra(EXTRA_CMD,0)>0){
58
+            int cmd = intent.getIntExtra(EXTRA_CMD,0);
56 59
             if(cmd == CMD_EXIT_CAMERA_CONNECTION){
57 60
                 stopCameraService();
58 61
                 return START_NOT_STICKY;
@@ -63,7 +66,7 @@ public class CameraService extends Service {
63 66
                 }
64 67
             }else if(cmd == CMD_START_CAPTURE_PHOTO){
65 68
                 if(isInitExecuted){
66
-                    sessionWorkingDirPath = intent.getStringExtra("session_dir");
69
+                    sessionWorkingDirPath = intent.getStringExtra(EXTRA_SESSION_DIR);
67 70
                     if(!TextUtils.isEmpty(sessionWorkingDirPath)){
68 71
                         startCapture();
69 72
                     }

+ 77 - 110
app/src/main/java/ai/pai/lensman/session/SessionInteractor.java

@@ -1,37 +1,42 @@
1 1
 package ai.pai.lensman.session;
2 2
 
3
+import android.content.BroadcastReceiver;
4
+import android.content.Context;
5
+import android.content.Intent;
6
+import android.content.IntentFilter;
3 7
 import android.os.Handler;
4 8
 import android.os.Handler.Callback;
5 9
 import android.os.Message;
6
-import android.text.TextUtils;
7 10
 
8 11
 import com.android.common.utils.LogHelper;
9 12
 
10 13
 import java.io.File;
11
-import java.util.Timer;
12
-import java.util.TimerTask;
13 14
 
15
+import ai.pai.lensman.App;
14 16
 import ai.pai.lensman.bean.PhotoBean;
15 17
 import ai.pai.lensman.bean.SessionBean;
16
-import ai.pai.lensman.dslr.CameraJNIInterface;
18
+import ai.pai.lensman.dslr.CameraService;
17 19
 import ai.pai.lensman.service.Constants;
18 20
 
21
+import static ai.pai.lensman.dslr.CameraService.ACTION_CAMERA_SERVICE_STATUS_CHANGE;
22
+import static ai.pai.lensman.dslr.CameraService.CMD_EXIT_CAMERA_CONNECTION;
23
+import static ai.pai.lensman.dslr.CameraService.CMD_INIT_CAMERA_CONNECTION;
24
+import static ai.pai.lensman.dslr.CameraService.CMD_START_CAPTURE_PHOTO;
25
+import static ai.pai.lensman.dslr.CameraService.EXTRA_CMD;
26
+import static ai.pai.lensman.dslr.CameraService.EXTRA_DATA_PART;
27
+import static ai.pai.lensman.dslr.CameraService.EXTRA_STATUS_PART;
28
+import static ai.pai.lensman.dslr.CameraService.MSG_CAMERA_CONN_ERROR;
29
+import static ai.pai.lensman.dslr.CameraService.MSG_CAMERA_INIT_SUCCESS;
30
+import static ai.pai.lensman.dslr.CameraService.MSG_CAMERA_NEW_PHOTO_FOUND;
31
+
19 32
 public class SessionInteractor implements Callback{
20 33
 
21
-    private Timer photoCaptureTimer;
34
+    private Handler mHandler;
22 35
     private SessionBean sessionBean;
23 36
     private SessionListener listener;
24 37
     private String sessionWorkingDirPath;
25 38
 
26
-    private boolean isWorking;
27
-    private boolean isLastQueryReturned = true;
28
-
29
-    private Handler cameraInitHandler;
30
-    private static final int MSG_CAMERA_INIT_EVENT = 1001;
31
-
32
-    private static final String MSG_TYPE_CAMERA_ERROR = "camero error";//相机错误,可能是线松动了。先exit,然后重新init
33
-    private static final String MSG_TYPE_NOT_INIT = "not init";  //需要初始化
34
-    private static final String MSG_TYPE_TIME_OUT = "time out";  //继续调用waitforevent
39
+    private static final int MSG_RETRY_INIT_CAMERA = 1001;
35 40
 
36 41
     private static final String TAG = "SessionInteractor";
37 42
 
@@ -42,16 +47,10 @@ public class SessionInteractor implements Callback{
42 47
 
43 48
     @Override
44 49
     public boolean handleMessage(Message message) {
45
-        if(message.what==MSG_CAMERA_INIT_EVENT){
46
-            int result = CameraJNIInterface.getInstance().java_mygpcamerainit();
47
-            listener.onCameraStatusChanged("mygpcamerainit return "+result);
48
-            if(result>=0){
49
-                listener.onSessionStartSuccess(sessionBean.sessionId);
50
-                isWorking = true;
51
-                startCapture();
52
-            }else{
53
-                cameraInitHandler.sendEmptyMessageDelayed(MSG_CAMERA_INIT_EVENT,1000);
54
-            }
50
+        if(message.what == MSG_RETRY_INIT_CAMERA){
51
+            Intent intent = new Intent(App.getAppContext(), CameraService.class);
52
+            intent.putExtra(EXTRA_CMD,CMD_INIT_CAMERA_CONNECTION);
53
+            App.getAppContext().startService(intent);
55 54
         }
56 55
         return false;
57 56
     }
@@ -66,105 +65,36 @@ public class SessionInteractor implements Callback{
66 65
 
67 66
     public void startSession(){
68 67
         LogHelper.d(TAG,"startSession");
68
+        mHandler = new Handler(this);
69 69
         sessionWorkingDirPath = Constants.APP_IMAGE_DIR + File.separator + sessionBean.sessionId
70 70
                 + File.separator + ai.pai.lensman.utils.Constants.ORIGIN_DIR_NAME;
71 71
        new File(sessionWorkingDirPath).mkdirs();
72
-
73
-        int result = CameraJNIInterface.getInstance().java_mygpcamerainit();
74
-        listener.onCameraStatusChanged("mygpcamerainit return "+result);
75
-        if(result>=0){
76
-            LogHelper.d("czy","mygpcamerainit init success="+result);
77
-            listener.onSessionStartSuccess(sessionBean.sessionId);
78
-            isWorking = true;
79
-            startCapture();
80
-        }else{
81
-            LogHelper.d("czy","mygpcamerainit init fail ="+result+" and schedule retry");
82
-            if(cameraInitHandler!=null){
83
-                cameraInitHandler.removeCallbacksAndMessages(null);
84
-                cameraInitHandler = null;
85
-            }
86
-            cameraInitHandler = new Handler(this);
87
-            cameraInitHandler.sendEmptyMessageDelayed(MSG_CAMERA_INIT_EVENT,1000);
88
-            listener.onSessionStartError(sessionBean.sessionId);
89
-        }
90
-
72
+        IntentFilter intentFilter = new IntentFilter(ACTION_CAMERA_SERVICE_STATUS_CHANGE);
73
+        App.getAppContext().registerReceiver(cameraReceiver,intentFilter);
74
+        Intent intent = new Intent(App.getAppContext(), CameraService.class);
75
+        intent.putExtra(EXTRA_CMD,CMD_INIT_CAMERA_CONNECTION);
76
+        App.getAppContext().startService(intent);
91 77
     }
92 78
 
93 79
     public void startCapture() {
94
-        if(photoCaptureTimer !=null){
95
-            photoCaptureTimer.cancel();
96
-            photoCaptureTimer = null;
97
-        }
98
-        photoCaptureTimer = new Timer();
99
-        photoCaptureTimer.schedule(new TimerTask() {
100
-            @Override
101
-            public void run() {
102
-                fetchPhotoTask();
103
-            }
104
-        },1000,10);
105
-        LogHelper.d("czy","startCapture ,schedule fetchPhotoTask ");
106
-    }
107
-
108
-    private void fetchPhotoTask(){
109
-        if(!isWorking){
110
-            return;
111
-        }
80
+        Intent intent = new Intent(App.getAppContext(), CameraService.class);
81
+        intent.putExtra(EXTRA_CMD,CMD_START_CAPTURE_PHOTO);
82
+        App.getAppContext().startService(intent);
112 83
 
113
-        if(!isLastQueryReturned){
114
-            LogHelper.d("czy","fetchPhotoTask last query not finished,return ");
115
-            return;
116
-        }
117
-
118
-        isLastQueryReturned = false;
119
-        String eventMsg = CameraJNIInterface.getInstance().java_mygpcamerawaitforevent(sessionWorkingDirPath);
120
-        listener.onCameraStatusChanged("mygpcamerawaitforevent return "+eventMsg);
121
-        LogHelper.d("czy","mygpcamerawaitforevent return result = "+eventMsg);
122
-        if(eventMsg!=null && eventMsg.length()>0){
123
-            if(MSG_TYPE_NOT_INIT.equalsIgnoreCase(eventMsg)||MSG_TYPE_CAMERA_ERROR.equalsIgnoreCase(eventMsg)){
124
-                endSession();
125
-                startSession();
126
-            }else if(MSG_TYPE_TIME_OUT.equalsIgnoreCase(eventMsg)){
127
-
128
-            }else{
129
-                String sub = eventMsg.substring(0,1);
130
-                if(TextUtils.isDigitsOnly(sub)){
131
-                    LogHelper.d(TAG,"fetchPhotoTask new photo found");
132
-                    PhotoBean bean = new PhotoBean();
133
-                    bean.photoName = eventMsg;
134
-                    bean.photoId = Long.parseLong(eventMsg.substring(0,eventMsg.lastIndexOf(".")));
135
-                    bean.captureTime = bean.photoId;
136
-                    bean.isRawPhoto = true;
137
-                    bean.uploadStatus = PhotoBean.UploadStatus.STATUS_NO_BEGIN;
138
-                    bean.sessionId = sessionBean.sessionId;
139
-                    bean.lensmanId = sessionBean.lensmanId;
140
-                    bean.sessionSeq = sessionBean.sessionSeq;
141
-                    bean.sessionDate = sessionBean.sessionDate;
142
-                    bean.sessionCreateTime = sessionBean.createTime;
143
-                    bean.photoPath = sessionWorkingDirPath+File.separator+eventMsg;
144
-                    listener.onSessionPhotoCaptured(bean);
145
-                }
146
-            }
147
-        }
148
-
149
-        isLastQueryReturned = true;
150 84
     }
151 85
 
152 86
 
153
-
154 87
     public void endSession(){
155
-        isWorking = false;
156
-        if(photoCaptureTimer !=null){
157
-            photoCaptureTimer.cancel();
158
-            photoCaptureTimer = null;
159
-        }
160
-        int result = CameraJNIInterface.getInstance().java_mygpcameraexit();
161
-        listener.onCameraStatusChanged("mygpcameraexit return "+result);
162
-        listener.onSessionEnd(sessionBean.sessionId);
163
-        if(cameraInitHandler!=null){
164
-            cameraInitHandler.removeCallbacksAndMessages(null);
165
-            cameraInitHandler = null;
88
+        if(mHandler!=null){
89
+            mHandler.removeCallbacksAndMessages(null);
90
+            mHandler = null;
166 91
         }
92
+        Intent intent = new Intent(App.getAppContext(), CameraService.class);
93
+        intent.putExtra(EXTRA_CMD,CMD_EXIT_CAMERA_CONNECTION);
94
+        App.getAppContext().startService(intent);
95
+        App.getAppContext().unregisterReceiver(cameraReceiver);
167 96
         LogHelper.d("czy","endSession ");
97
+        listener.onSessionEnd(sessionBean.sessionId);
168 98
     }
169 99
 
170 100
     public void deletePhoto(PhotoBean photoBean){
@@ -172,4 +102,41 @@ public class SessionInteractor implements Callback{
172 102
         new File(photoBean.photoPath).delete();
173 103
     }
174 104
 
105
+    private BroadcastReceiver cameraReceiver = new BroadcastReceiver() {
106
+        @Override
107
+        public void onReceive(Context context, Intent intent) {
108
+            if(!ACTION_CAMERA_SERVICE_STATUS_CHANGE.equals(intent.getAction())){
109
+                return;
110
+            }
111
+            int status = intent.getIntExtra(EXTRA_STATUS_PART,0);
112
+            if(status==MSG_CAMERA_INIT_SUCCESS){
113
+                listener.onSessionStartSuccess(sessionBean.sessionId);
114
+                listener.onCameraStatusChanged("camera init success");
115
+                startCapture();
116
+            }else if(status == MSG_CAMERA_CONN_ERROR){
117
+                listener.onCameraStatusChanged("camera connection error");
118
+                listener.onSessionStartError(sessionBean.sessionId);
119
+                mHandler.sendEmptyMessageDelayed(MSG_RETRY_INIT_CAMERA,3000);
120
+            }else if(status == MSG_CAMERA_NEW_PHOTO_FOUND){
121
+                String eventMsg = intent.getStringExtra(EXTRA_DATA_PART);
122
+                LogHelper.d(TAG,"fetchPhotoTask new photo found");
123
+                listener.onCameraStatusChanged("camera new Photo found "+eventMsg);
124
+                PhotoBean bean = new PhotoBean();
125
+                bean.photoName = eventMsg;
126
+                bean.photoId = Long.parseLong(eventMsg.substring(0,eventMsg.lastIndexOf(".")));
127
+                bean.captureTime = bean.photoId;
128
+                bean.isRawPhoto = true;
129
+                bean.uploadStatus = PhotoBean.UploadStatus.STATUS_NO_BEGIN;
130
+                bean.sessionId = sessionBean.sessionId;
131
+                bean.lensmanId = sessionBean.lensmanId;
132
+                bean.sessionSeq = sessionBean.sessionSeq;
133
+                bean.sessionDate = sessionBean.sessionDate;
134
+                bean.sessionCreateTime = sessionBean.createTime;
135
+                bean.photoPath = sessionWorkingDirPath+File.separator+eventMsg;
136
+                listener.onSessionPhotoCaptured(bean);
137
+            }
138
+
139
+        }
140
+    };
141
+
175 142
 }